//
// Created by Jisam on 2024/7/12.
//
#include <bits/stdc++.h>
// 定义一对字符串和整数的配对类型
#define PSI pair<string,int>
// 定义一对整数的配对类型
#define PII pair<int,int>
// 定义x方向的偏移量
#define x first
// 定义y方向的偏移量
#define y second
// 定义长整型别名
#define i64 long long
// 使用标准库命名空间
using namespace std;

// 定义迷宫的最大尺寸
const int N = 500 + 5;
// 存储答案的变量
int ans;
// 存储迷宫布局的二维数组
char ma[N][N];
// 标记某个位置是否被访问过的二维数组
int vis[N][N];
// x方向的移动选项
int dx[] = {-1,1,0,0};
// y方向的移动选项
int dy[] = {0,0,-1,1};
// 迷宫的行数和列数
int n,m;

/**
 * @brief 广度优先搜索函数，用于寻找与起点相连的空白区域
 * @param x 起点的x坐标
 * @param y 起点的y坐标
 */
void bfs(int x,int y){
    // 使用队列来进行广度优先搜索
    queue<PII> q;
    q.push({x,y});
    while (q.size())
    {
        // 取出队列头部的元素
        int tx = q.front().first;
        int ty = q.front().second;
        q.pop();
        // 如果当前位置是障碍物，则跳过
        if(ma[tx][ty] == '*'){
            continue;
        }
        // 遍历四个可能的移动方向
        for(int i = 0 ; i < 4 ; i ++){
            int fx = tx + dx[i];
            int fy = ty + dy[i];
            // 如果移动后的位置有效，并且是空白区域且未被访问过
            if(fx >= 0 && fy >= 0 && fx < n && fy < m && ma[fx][fy] == '0' && !vis[fx][fy] )
            {
                // 标记该位置为已访问
                ma[fx][fy] = '2';
                vis[fx][fy] = 1;
                // 将该位置加入队列继续搜索
                q.push({fx,fy});
            }
        }

    }
}

/**
 * @brief 主函数，负责读入迷宫信息并计算答案
 */
void solve() {
    // 读入迷宫的行数和列数
    cin >> n >> m;
    // 读入迷宫的具体布局
    for(int i = 0; i < n ; i ++)
    {
        for(int j = 0 ; j < m ; j ++)
        {
            cin >>ma[i][j];
        }
    }
    // 从每一面墙开始，进行广度优先搜索
    for(int i = 0 ;i < n ; i ++){
        if(!vis[i][0] && ma[i][0] != '*') bfs(i,0);
        if(!vis[i][m] && ma[i][m] != '*')  bfs(i,m);
    }
    for(int i = 0 ;i < m ; i ++){
        if(!vis[0][i]&&ma[0][i] != '*')  bfs(0,i);
        if(!vis[n][i]&&ma[n][i] != '*')  bfs(n,i);
    }
    // 统计剩余的未被搜索到的空白区域数量
    for(int i = 1; i < n - 1; i ++)
    {
        for(int j = 1 ; j < m - 1; j ++)
        {
            if(ma[i][j] == '0')ans ++;
        }
    }
    // 输出答案
    cout << ans;
}

// 程序入口
int main() {
    // 关闭同步标准输入输出，提高效率
    ios::sync_with_stdio(false);
    // 解除cin与cout的绑定，提高效率
    cin.tie(nullptr);
    // 调用主函数解决问题
    solve();
    // 程序正常结束
    return 0;
}
